home *** CD-ROM | disk | FTP | other *** search
/ Plug-In Power Pack for Netscape Communicator / Plug-In Power Pack for Netscape Communicator.iso / plugins / dataviews / include / ringbuf.h < prev    next >
C/C++ Source or Header  |  1997-05-08  |  2KB  |  57 lines

  1. /*
  2. |    file - ringbuf.h
  3. |===================================================================
  4. |
  5. |                copyright (C) 1987, V.I. Corporation
  6. |
  7. |    ringbuf.h -- ringbuffer typedefs and macros
  8. |
  9. |    Alan C Morse      11 Dec 87
  10. |
  11. |===================================================================
  12. |
  13. |    include-file description/function:
  14. |    Typedefs and macros for creating and accessing ring buffer
  15. |    structures.
  16. |    NOTE that all indices into the buffer must be positive.
  17. |
  18. |===================================================================
  19. */
  20. typedef struct
  21.   {
  22.   short NumEntries; /* Number of entries in the ring buffer */
  23.   short EntrySize; /* Size in bytes of an entry in the buffer */
  24.   short NowIndex; /* Current position in the buffer */
  25.   char *buffer;
  26.   } RING_BUFFER;
  27.  
  28. #define CREATE_RING_BUFFER( rb, n, s ) \
  29.     { \
  30.     rb = (RING_BUFFER*)S_ALLOC( sizeof(RING_BUFFER) ); \
  31.     ((RING_BUFFER*)rb)->NumEntries = n; \
  32.     ((RING_BUFFER*)rb)->EntrySize = s; \
  33.     ((RING_BUFFER*)rb)->NowIndex = 0; \
  34.     ((RING_BUFFER*)rb)->buffer = S_ALLOC( n * s ); \
  35.     memset(((RING_BUFFER*)rb)->buffer,0,(n*s));\
  36.     }
  37.  
  38. #define DESTROY_RING_BUFFER( rb ) \
  39.     { \
  40.     S_FREE( (ADDRESS)((RING_BUFFER*)rb)->buffer ); \
  41.     S_FREE( (ADDRESS)((RING_BUFFER*)rb) ); \
  42.     }
  43.  
  44. /* Moves the current position of the ring buffer i positions */
  45. #define INCREMENT_RING_BUFFER( rb, i ) \
  46.     ((RING_BUFFER*)rb)->NowIndex =  \
  47.       ( ((RING_BUFFER*)rb)->NowIndex + (i) ) % \
  48.       ((RING_BUFFER*)rb)->NumEntries; \
  49.  
  50. /* Returns the address of the i-th entry in the ring buffer */
  51. #define RING_BUFFER_ENTRY( rb, i ) \
  52.     ( ( ( (((RING_BUFFER*)rb)->NowIndex + (i)) % \
  53.     ((RING_BUFFER*)rb)->NumEntries ) *  \
  54.     ((RING_BUFFER*)rb)->EntrySize ) +  \
  55.     ((RING_BUFFER*)rb)->buffer )  \
  56.  
  57.